package com.example.forum.interceptor;

import com.example.forum.config.AppConfig;
import com.example.forum.model.User;
import com.example.forum.services.IUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 管理员权限拦截器
 */
@Component
@Slf4j
public class AdminInterceptor implements HandlerInterceptor {
    
    @Autowired
    private IUserService userService;
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取Session，如果不存在则不创建
        HttpSession session = request.getSession(false);
        // Session 为空，表示未登录
        if (session == null) {
            // 设置响应状态码为401（未授权）
            response.setStatus(401);
            // 重定向到登录页面
            response.sendRedirect("/sign-in.html");
            return false;
        }
        
        // 获取session中的用户对象
        User user = (User) session.getAttribute(AppConfig.USER_SESSION);
        // 用户未登录
        if (user == null) {
            // 设置响应状态码为401（未授权）
            response.setStatus(401);
            // 重定向到登录页面
            response.sendRedirect("/sign-in.html");
            return false;
        }
        
        // 每次请求都从数据库获取最新的用户信息，确保权限是最新的
        User latestUser = userService.selectById(user.getId());
        if (latestUser == null || latestUser.getIsAdmin() != 1) {
            // 用户不存在或不是管理员
            // 更新会话中的用户信息（如果用户仍然存在）
            if (latestUser != null) {
                session.setAttribute(AppConfig.USER_SESSION, latestUser);
                log.info("用户会话已更新，用户不再具有管理员权限: userId={}", latestUser.getId());
            }
            
            // 设置响应状态码为403（禁止访问）
            response.setStatus(403);
            // 重定向到未授权页面
            response.sendRedirect("/unauthorized.html");
            return false;
        }
        
        // 更新会话中的用户信息，确保使用最新的数据
        session.setAttribute(AppConfig.USER_SESSION, latestUser);
        
        // 管理员权限验证通过
        return true;
    }
} 